Comparison of C Sharp and Visual Basic .NET

Programming language comparisons
General comparison
Basic syntax
Basic instructions
Arrays
Associative arrays
String operations
String functions
List comprehension
Object-oriented programming
Object-oriented constructors
Database access
Database RDBMS

Evaluation strategy
List of "hello world" programs

ALGOL 58's influence on ALGOL 60
ALGOL 60: Comparisons with other languages
Comparison of ALGOL 68 and C++
ALGOL 68: Comparisons with other languages
Compatibility of C and C++
Comparison of Pascal and Borland Delphi
Comparison of Object Pascal and C
Comparison of Pascal and C
Comparison of Java and C++
Comparison of C# and Java
Comparison of C# and Visual Basic .NET

C# and Visual Basic .NET are the two primary languages used to program on the .NET Framework.

Contents

Language history

C# and VB.NET are syntactically very different languages with very different history. As the name suggests, the C# syntax is based on the core C language originally developed by Bell Labs (AT&T) in the 1970s [1] and eventually evolved into the fully object oriented C++ language still in use today. Much of the Java syntax is also based on this same C++ language,[2] which is one of the reasons the two share a common look and feel. See Comparison of Java and C Sharp for more on this topic.

VB.NET has its roots in the BASIC language of the '60s with its name being an acronym for "Beginner's All-purpose Symbolic Instruction Code". In its beginning, BASIC was used in the college community as a "basic" language for first exposure to computer programming and the acronym represented the language accurately.[3] In the '70s, the language was picked up by microcomputer manufacturers of the era to be used as both a simple ROM embedded programming language as well as a quasi operating system for input/output control.[4] In the early '80s, the language was picked up by Microsoft and expanded significantly beyond its original intent into their "Visual Basic" language/platform that was sold throughout the 1990s as a "rapid application development" (RAD) tool for Windows programming.[5] It competed directly against other RAD tools of the 1990s such as PowerBuilder.[6] Even though Visual Basic was a successful development platform, it was discontinued after its 6th version (VB6) when Microsoft introduced the .NET Framework and its related Visual Studio development platform in the early 2000s.

Language comparison

Though C# and VB.NET are syntactically very different, that is where the differences mostly end. Microsoft developed both of these languages to be part of the same .NET Framework development platform. They are both developed, managed, and supported by the same language development team at Microsoft.[7] They compile to the same intermediate language (IL), which runs against the same .NET Framework runtime libraries.[8] Although there are some differences in the programming constructs (discussed further below), their differences are primarily syntactic and, assuming one avoids the Visual Basic "Compatibility" libraries provided by Microsoft to aid conversion from VB6, almost every command in VB has an equivalent command in C# and vice versa. Lastly, both languages reference the same Base Classes of the .NET Framework to extend their functionality. As a result, with few exceptions, a program written in either language can be run through a simple syntax converter to translate to the other. There are many open source and commercially available products for this purpose.

Runtime multi-language support

One of the main goals of .NET has been its multi-language support. The intent of the design was that all of the various Microsoft languages should have the same level of access to all OS features, should be able to expose the same level of power and usability, and simplify calling from a module in one language to that written in another language.

In implementation, all .NET programming languages share the same runtime engine, uniform Abstract syntax tree, and Common Intermediate Language. Additionally all .NET languages have access to platform features including garbage collection, cross language inheritance, exception handling, and debugging. This allows the same output binary to be produced from any .NET programming language.

Development environment

Visual Studio provides minor differences in the development environment for C# and VB.Net. With each subsequent release of Visual Studio, the differences between development environments for these languages have been reduced. For instance early versions of Visual Studio had poor support for Intellisense in C# compared to Visual Basic .NET, and did not offer background compilation for C#.[9] Currently, the main differences in the development environments are additional features for Visual Basic .NET that originated in VB6, including:

Background compilation is a feature of the Visual Studio IDE whereby code is compiled as it is written by the programmer with the purpose of identifying compilation errors without requiring the solution to be built. This feature has been available for Visual Basic since .NET 1.1 and was present in early versions of Visual Studio for Visual Basic .NET. However, background compilation is a relatively new concept for Visual C# and is available with service pack 1 for Visual Studio 2008 Standard Edition and above. A distinct disadvantage for C# is that the Error List panel does not update until the solution is rebuilt. Refactoring large projects in C# is made more difficult by the need to frequently rebuild the solution in order to highlight compilation errors.[10] Such is not the case with Visual Basic because the Error List panel is synchronised with the background compiler.

Background Compilation is less demanding on system resources and results in faster build cycles.[10] This is a particular advantage with large projects and can significantly reduce the time required to start debugging in the IDE.[10]

Language features

The bulk of the differences between C# and VB.NET from a technical perspective are syntactic sugar.That is, most of the features are in both languages, but some things are easier to do in one language than another. Many of the differences between the two languages are actually centered around the IDE.

Features of Visual Basic .NET not found in C#

Features of C# not found in Visual Basic .NET

Other characteristics of Visual Basic .NET not applicable to C#

Dim i As Integer = "1" 'Compiler automatically converts String to Integer
Dim j As String = 1 'Compiler automatically converts Integer to String
If i = j Then 'Compiler does cast and compare between i and j
    MessageBox.Show("Avoid using, but this message will appear!")
End If

It should be noted that although the default is for 'Option Strict' is off, it is recommended by Microsoft[14] and widely considered to be a good practice to turn 'Option Strict' "on", due to the fact it increases application performance, and eliminates the chance of naming errors and other programming mistakes.[15]

Other characteristics of C# not applicable to Visual Basic .NET

Syntax comparisons

Visual Basic .NET terminates a block of code with End BlockName statements (or Next statements, for a for loop) which are more familiar for programmers with experience using T-SQL. In C#, the braces, {}, are used to delimit blocks, which is more familiar to programmers with experience in other widely-deployed languages such as C++ and Java. Additionally, in C# if a block consists of only a single statement, the braces may be omitted.

C# is case sensitive while Visual Basic .NET is not. Thus in C# it is possible to have two variables with the same name, for example variable1 and Variable1. Visual Studio will correct the case of variables as they are typed in VB.NET. In many cases however, case sensitivity can be useful. C# programmers typically capitalize type names and leave member and variable names lowercase. This allows, for example, fairly natural naming of method arguments: public int CalculateOrders(Customer customer). Of course, this can cause problems for those converting C# code to a case-insensitive language, such as Visual Basic, or to those unaccustomed to reading a case sensitive language.

Keywords

Visual Basic is not case sensitive, which means any combinations of upper and lower cases in keywords are acceptable. However Visual Studio automatically converts all Visual Basic keywords to the default capitalised forms, e.g. "Public", "If".

C# is case sensitive and all C# keywords are in lower cases.

Visual Basic and C# share most keywords, with the difference being the default (Remember Visual Basic is not case sensitive) Visual Basic keywords are the capitalised versions of the C# keywords, e.g. "Public" vs "public", "If" vs "if".

A few keywords have very different versions in Visual Basic and C#:

Some C# keywords such as sealed represent different things when applied to methods as opposed to when they are applied to class definitions. VB.NET, on the other hand, uses different keywords for different contexts.

Comments

C# Visual Basic .NET
//Single line comment 
 
/*Multi-line comment
  line 2
  line 3*/
 
///XML single line comment
 
/**XML multi-line comment
   line 2
   line 3*/
'Single line comment

Multi-line comment not available

'''XML single line comment

XML multi-line comment not available

---------------------------

Conditionals

C# Visual Basic .NET
if (condition)
{ 
    // condition is true 
}
else if (othercondition)
{ 
    // condition is false and othercondition is true
}
else
{ 
    // condition and othercondition are false 
}
If condition Then 
    ' condition is true
ElseIf othercondition Then
    ' condition is false and othercondition is true
Else
    ' condition and othercondition false
End If

Loops

C# Visual Basic .NET
for (int i = 0; i <= number - 1; i++) 
{
    // loop from zero up to one less than number
}
For i As Integer = 0 To number - 1
    ' loop from zero up to one less than number
Next
for (int i = number; i >= 0; i--)
{
    // loops from number down to zero
}
For i As Integer = number To 0 Step -1
    ' loops from number down to zero
Next
break; //breaks out of a loop
Exit For 'breaks out of a for loop
Exit While 'breaks out of a while loop
Exit Do 'breaks out of a do loop

Comparers

Primitive types

C# Visual Basic .NET
if (a == b)   
{
    // equal
}
If a = b Then
    ' equal
End If
if (a != b)
{
    // not equal
}

Or:

if (!(a == b))
{
    // not equal
}
If a <> b Then
    ' not equal
End If

Or:

If Not a = b Then
    ' not equal
End If
if (a == b & c == d | e == f)
{
    // multiple comparisons
}
If a = b And c = d Or e = f Then
    ' multiple comparisons
End If
if (a == b && c == d || e == f)
{
    // short-circuiting comparisons
}
If a = b AndAlso c = d OrElse e = f Then
    ' short-circuiting comparisons
End If

Object types

C# Visual Basic .NET
if (Object.ReferenceEquals(a, b))   
{
    // variables refer to the same instance
}
If a Is b Then 'Can also be written as If Object.ReferenceEquals(a, b) Then
    ' variables refer to the same instance
End If
if (!Object.ReferenceEquals(a, b))   
{
    // variables do not refer to the same instance
}
If a IsNot b Then
    ' variables do not refer to the same instance
End If
if (a.Equals(b))   
{
    // instances are equivalent
}
If a = b Then 'Or a.Equals(b)
    ' instances are equivalent
End If
if (! a.Equals(b))
{
    // not equivalent
}
If a <> b Then
    ' not equivalent
End If
var type = typeof(int);
Dim type = GetType(Integer)
if (a is b)
{
    // types of a and b are compatible
}
If TypeOf a Is b Then
    ' types of a and b are compatible
End If
if (!(a is b))
{
    // types of a and b are not compatible
}
If Not TypeOf a Is b Then
    ' types of a and b are not compatible
End If

Note: these examples for equivalence tests assume neither the variable "a" nor the variable "b" is a Null reference (Nothing in Visual Basic.NET). If "a" were null, the C# evaluation of the .equals method would throw a NullReferenceException, whereas the VB.NET = operator would return true if both were null, or false if only one was null (and evaluate the equals method if neither were null). They also assume that the .equals method and the = operator are implemented for the class type in question. Omitted for clarity, the exact transliteration would be:

C#

if(object.equals(a,b))

VB.NET

If a = b Then

Adoption and community support

Both C# and VB.NET have high adoption rates, and very active developer communities and Microsoft fully supports both communities. Most .NET Framework developers use C# as their primary language.[16] C# has an advantage in terms of the level of community activity on the Internet and there are more books available for C#.

Examples of community and industry adoption include:

Other languages

C++/CLI (formerly Managed C++)

C++/CLI (a replacement for Managed Extensions for C++) does not have the adoption rate of C# or VB.NET, but does have a significant following. C++/CLI syntactically, stylistically, and culturally is closest to C#. However, C++/CLI stays closer to its C++ roots than C# does. C++/CLI directly supports pointers, destructors, and other unsafe program concepts which are not supported or limited in the other languages. It allows the direct use of both .NET code and standard C++ code. C++/CLI is used for porting native/legacy C++ applications into the .NET framework, or cases where the programmer wants to take more control of the code; but this control comes at a significant cost of ease of use and readability. Many of the automated tools that come with Visual Studio have reduced functionality when interacting with C++ code. This is because reflection cannot provide as much information about the code as it can for C# and VB.net

J#

J# runs a distant fourth in terms of adoption. J# is a language primarily designed to ease the transition of Java applications to the .NET framework; it allows developers to leave much of their Java or J++ code unchanged while still running it in the .NET framework, thus allowing them to migrate small pieces of it into another .NET language, such as C#, individually. J# does not receive the same level of updates as the other languages, and does not have the same level of community support. For example, Visual Studio 2005 Team System supports automatic generation of Unit Tests in C#, VB.Net, and C++, but excludes J#. J# has been discontinued and is not included in Visual Studio 2008 or newer versions, since the existing J# feature set largely meets customer needs and usage of J# is declining.

Additional .NET languages

All .NET languages compile down to Common Intermediate Language (CIL), which contains rich metadata and is functionally and logically equivalent to the original .NET language code. For these reasons, while it is possible to code directly in CIL, it is rarely done. The equivalency of CIL to .NET language code permits tools such as .NET Reflector to transform a .NET assembly into source code that is nearly identical to the original source. Code obfuscators are often used to guard against this, and operate by directly modifying the CIL of an assembly in order to make it difficult or impossible to de-compile to a higher level .NET language.

References

  1. ^ http://cm.bell-labs.com/cm/cs/who/dmr/chist.html
  2. ^ http://www.freejavaguide.com/history.html
  3. ^ http://en.wikipedia.org/wiki/BASIC
  4. ^ http://en.wikipedia.org/wiki/TRS-80
  5. ^ http://www.forestmoon.com/BIRTHofVB/BIRTHofVB.html
  6. ^ http://www.lannigan.org/powersoft_powerbuilder_history.htm
  7. ^ http://www.infoworld.com/article/09/02/27/Microsoft_converging_programming_languages_1.html?R=printThis&A=/article/09/02/27/Microsoft_converging_programming_languages_1.html
  8. ^ http://www.dotnet-guide.com/msintermediate.html
  9. ^ Matthew Gertz. "Scaling Up: The Very Busy Background Compiler". MSDN Magazine. http://msdn.microsoft.com/msdnmag/issues/05/06/AdvancedBasics/. Retrieved 2008-12-16. 
  10. ^ a b c "System and methodology providing compiler-assisted refactoring". http://www.freepatentsonline.com/6804682.html. 
  11. ^ Jonathan Allen. "Does C# Need VB9's XML Literals?". http://www.infoq.com/news/2007/03/CSharp-XML. Retrieved 2009-01-13. 
  12. ^ "Early vs. Late Binding". http://visualbasic.about.com/od/usingvbnet/a/earlybind.htm. 
  13. ^ MSDN: Try...Catch...Finally Statement (Visual Basic)
  14. ^ MSDN: Option Strict Statement
  15. ^ GetDotNetCode.com:"Option Strict On". http://www.getdotnetcode.com/gdncstore/free/Articles/OPTION%20STRICT%20ON.htm. 
  16. ^ a b c Todd Anglin. "Survey Says: C# more popular than VB". Telerik. http://telerikwatch.com/2008/04/survey-says-c-more-popular-than-vb.html. Retrieved 2008-12-16. 
  17. ^ "C# is rated higher than Visual Basic for the first time in history". http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html. 
  18. ^ "Mono brings Visual Basic programs to Linux". Linux-Watch. http://www.linux-watch.com/news/NS5656359853.html. Retrieved 2010-03-25. 
  19. ^ a b c Patrick Meader. "C#'s Exploding Mindshare". Visual Studio Magazine, November 2007. http://visualstudiomagazine.com/columns/article.aspx?editorialsid=2333. Retrieved 2008-12-16. 
  20. ^ "VB and C# Coevolution". MSDN. http://blogs.msdn.com/scottwil/archive/2010/03/09/vb-and-c-coevolution.aspx. Retrieved 2010-03-27. 

External links